//单例设计模式 类
export default class SocketService {
    //单例方法
    static instance = null;
    static get Instance(){
        if(!this.instance){
            this.instance = new SocketService();
        }
        return this.instance;
    }
    // 和服务端连接的socket对象
    ws = null
    //存储回调函数
    callBackMapping = {}
    //标识是否连接成功了
    connected = false
    //记录重试的次数
    sendRetryCount = 0
    //重新连接服务器次数
    connectRetryCount = 0
    //定义连接服务器方法
    connect(){
        //连接服务器
        if(!window.WebSocket){
            //浏览器不支持WebSocket
            return console.log('浏览器不支持WebSocket')
        }
        //ws:指的是WebSocket对象   前端一般自带WebSocket,不用导包
            this.ws = new WebSocket('ws://localhost:9998')
            //连接成功事件onopen
            this.ws.onopen = ()=>{                
                console.log('连接服务端成功')
                this.connected = true
                //重置重新连接次数
                this.connectRetryCount = 0
            }
            //连接服务端失败onclose 或连接成功后服务器关闭
            this.ws.onclose = ()=>{
                console.log('连接服务端失败')
                this.connected = false
                this.connectRetryCount ++
                //尝试重连服务器
                setTimeout(()=>{this.connect();console.log('正在尝试第'+this.connectRetryCount+'次重连服务器')},this.connectRetryCount*500)               
            }
            //得到服务端发送过来的数据onmessage
            this.ws.onmessage = (msg)=>{
                console.log('从服务端获取到了数据')
                // console.log(msg.data)
                //储存服务器获取的信息
                //接收数据处理
                const recvData = JSON.parse(msg.data)
                const socketType =  recvData.socketType
                //判断回调函数是否存在
                if(this.callBackMapping[socketType]){
                    const action = recvData.action
                    if(action === 'getData'){
                        const realData = JSON.parse(recvData.data)//转换对象
                        //this指向当前的SocketService实例
                        this.callBackMapping[socketType].call(this, realData)
                    }else if(action === 'fullScreen'){
                        this.callBackMapping[socketType].call(this, recvData)
                    }else if(action === 'themeChange'){
                        this.callBackMapping[socketType].call(this, recvData)
                    }
                }
            }
    }
    // 注册回调函数 socketType回调函数位移标识
    registerCallBack(socketType, callback) {
        this.callBackMapping[socketType] = callback
      }
    // 取消某一个回调函数
    unRegisterCallBack(socketType) {
        this.callBackMapping[socketType] = null
    }
    //发送数据方法
    send(data){
        //判断有没有连接成功
        if(this.connected){
            this.sendRetryCount = 0
            this.ws.send(JSON.stringify(data))
        }else{
            this.sendRetryCount ++
            //连接不成功隔一段时间 再次发送 次数越多时间越长
            setTimeout(()=>{this.send(data)},this.sendRetryCount*500)
            console.log('正在执行第'+this.sendRetryCount+'次获取数据')
        }
        
    }
}